package homework00110;

import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.IntConsumer;

public class HomeWorkPoolDemo {

	public static void main(String[] args) throws Exception{
		//创建线程池对象
		ExecutorService service = Executors.newFixedThreadPool(4);
		//homework1:抽奖箱抽奖
		/*ArrayList<Integer> list=new ArrayList<>();
		Collections.addAll(list, 10,5,20,50,100,200,550,800,2,80,300,1000);
		service.submit(new MyRunnable(list,"抽奖箱1"));
		service.submit(new MyRunnable(list,"抽奖箱2"));
		service.shutdown();*/
		//homework2:1.生产5个 消费5个
		/*Desk d=new Desk();
		Fooide f=new Fooide(d);
		Cokker c=new Cokker(d);
		service.submit(f);
		service.submit(c);
		service.shutdown();*/
		//homework3:子进程先执行三次，主进程再执行五次，然后这个过程执行三次
			// 子进程先执行三次，主进程再执行五次
		/*hm3_Demo hm3 = new hm3_Demo();
		service.submit(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				for(int i=0;i<3;i++){
					hm3.Fu();
				}
			}
		});
		service.submit(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				for(int i=0;i<3;i++){
					hm3.Zi();
				}
			}
		});
		service.shutdown();*/
		/*homework4:编写一个可以从 1 到 n 输出代表这个数字的字符串的程序，
		 * 但是：如果这个数字可以被 3 整除，输出 "fizz"。
			如果这个数字可以被 5 整除，输出 "buzz"。
			如果这个数字可以同时被 3 和 5 整除，输出 "fizzbuzz"。
			例如，当 n = 15，输出： 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, 
			fizz, 13, 14, fizzbuzz。
			假设有这么一个类：
			class FizzBuzz {
  			public FizzBuzz(int n) { ... }               // constructor
  			public void fizz(printFizz) { ... }          // only output "fizz"
  			public void buzz(printBuzz) { ... }          // only output "buzz"
  			public void fizzbuzz(printFizzBuzz) { ... }  // only output "fizzbuzz"
  			public void number(printNumber) { ... }      // only output the numbers
			}
			请你实现一个有四个线程的多线程版  FizzBuzz， 
			同一个 FizzBuzz 实例会被如下四个线程使用：
			线程A将调用 fizz() 来判断是否能被 3 整除，如果可以，则输出 fizz。
			线程B将调用 buzz() 来判断是否能被 5 整除，如果可以，则输出 buzz。
			线程C将调用 fizzbuzz() 来判断是否同时能被 3 和 5 整除，
			如果可以，则输出 fizzbuzz。
			线程D将调用 number() 来实现输出既不能被 3 整除也不能被 5 整除的数字。*/
		/*int n = 15;
		FizzBuzz fizzBuzz = new FizzBuzz(n);
		Runnable fizz=new Runnable() {
			
			@Override
			public void run() {
				try {
					fizzBuzz.fizz(new Runnable() {
						
						@Override
						public void run() {
							// TODO Auto-generated method stub
							System.out.println("fizz");
						}
					});
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		};
		Runnable buzz=new Runnable() {
			
			@Override
			public void run() {
				try {
					fizzBuzz.buzz(new Runnable() {
						
						@Override
						public void run() {
							// TODO Auto-generated method stub
							System.out.println("buzz");
						}
					});
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		};
		Runnable fizzbuzz=new Runnable() {
			
			@Override
			public void run() {
				try {
					fizzBuzz.fizzbuzz(new Runnable() {
						
						@Override
						public void run() {
							// TODO Auto-generated method stub
							System.out.println("fizzbuzz");
						}
					});
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		};
		Runnable number=new Runnable() {
			
			@Override
			public void run() {
				try {
					fizzBuzz.number(new IntConsumer() {
						
						@Override
						public void accept(int value) {
							// TODO Auto-generated method stub
							System.out.println(value);
						}
					});
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		};
		service.submit(fizz);
		service.submit(buzz);
		service.submit(fizzbuzz);
		service.submit(number);
		service.shutdown();*/
		/*homework5:写两个线程，一个线程打印1~ 52，
		 * 另一个线程打印A~Z，打印顺序是12A34B…5152Z*/
		/*hm5_Demo hm5=new hm5_Demo();
		hm5_1 h1=new hm5_1(hm5);
		hm5_2 h2=new hm5_2(hm5);
		service.submit(h1);
		service.submit(h2);
		service.shutdown();*/
		/*homework6:使用多线程实现多个文件同步复制功能，
		 * 并在控制台显示复制的进度，进度以百分比表示。
		 * 例如：把文件A复制到E盘某文件夹下，
		 * 在控制台上显示“XXX文件已复制10%”，
		 * “XXX文件已复制20%”……“XXX文件已复制100%”，“XXX复制完成！”
		A文件复制了10%
		A文件复制了20%
		B文件复制10%
		A文件复制30%
		C文件复制10%
		B文件复制20%*/
		/*hm6 hm61=new hm6("sort.txt","sort1.txt");
		hm6 hm62=new hm6("stud.txt","stud1.txt");
		service.submit(hm61);
		service.submit(hm62);
		service.shutdown();*/
		/*homework7:设计4个线程，其中两个线程每次对j增加1，另外两个线程对j每次减少1。
		 * 考虑到线程的安全性写出程序。（不要使用atomaicInteger 来做）*/
		/*hm7_Demo hm7=new hm7_Demo();
		hm7_12 h1=new hm7_12(hm7,"线程1");
		hm7_12 h2=new hm7_12(hm7,"线程2");
		hm7_34 h3=new hm7_34(hm7,"线程3");
		hm7_34 h4=new hm7_34(hm7,"线程4");
		service.submit(h1);
		service.submit(h2);
		service.submit(h3);
		service.submit(h4);
		service.shutdown();*/
		/*homework8:现有函数 printNumber 可以用一个整数参数调用，
		 * 并输出该整数到控制台。例如，调用 printNumber(7) 将会输出 7 到控制台。
			给你类 ZeroEvenOdd 的一个实例，该类中有三个函数：
			zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递给三个不同线程：
			线程 A：调用 zero() ，只输出 0
			线程 B：调用 even() ，只输出偶数
			线程 C：调用 odd() ，只输出奇数
			修改给出的类，以输出序列 "010203040506..." ，其中序列的长度必须为 2n 。
			实现 ZeroEvenOdd 类：
			ZeroEvenOdd(int n) 用数字 n 初始化对象，表示需要输出的数。
			void zero(printNumber) 调用 printNumber 以输出一个 0 。
			void even(printNumber) 调用printNumber 以输出偶数。
			void odd(printNumber) 调用 printNumber 以输出奇数。
			示例 1：
			输入：n = 2
			输出："0102"
			解释：三条线程异步执行，其中一个调用 zero()，
			另一个线程调用 even()，最后一个线程调用odd()。正确的输出为 "0102"。
			示例 2：
			输入：n = 5
			输出："0102030405"*/
		/*ZeroEvenOdd zeo=new ZeroEvenOdd(10);
		Runnable zero=new Runnable() {
			
			@Override
			public void run() {
				try {
					zeo.zero(new IntConsumer() {
					    @Override
					    public void accept( int value ) {
					        System.out.print(value);
					    }
					});
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		};
		Runnable even=new Runnable() {
			
			@Override
			public void run() {
				try {
					zeo.even(new IntConsumer() {
					    @Override
					    public void accept( int value ) {
					        System.out.print(value);
					    }
					});
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		};
		Runnable odd=new Runnable() {
			
			@Override
			public void run() {
				try {
					zeo.odd(new IntConsumer() {
					    @Override
					    public void accept( int value ) {
					        System.out.print(value);
					    }
					});
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		};
		service.submit(zero);
		service.submit(even);
		service.submit(odd);
        service.shutdown();*/
	}
	
}
